# —*— coding = utf-8 -*-
# @Time :2021/11/308:21
# @File :混沌系统.py
# @Software: PyCharm
'''
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//         佛祖保佑       永无BUG     永不修改                       //
////////////////////////////////////////////////////////////////////
'''
#导入库
import copy

import numpy as np
import matplotlib.pyplot as plt


#罗素模型的解析式
def Rossler(x0,y0,z0,w,a,b,c,T):
  h = 0.03
  #存储不断更新的x0,y0,z0，用来后面绘图
  #dx/dt = -y -z
  #dy/dt = x +ay
  #dz/dt = b+z(x-c)
  global x
  x=[]
  global y
  y=[]
  global z
  z=[]
  for t in range(T):
    xt = x0 + h * (-w * y0 - z0)
    yt = y0 + h * (w * x0 + a* y0)
    zt = z0 + h * (b+z0 * (x0 - c))

    #x0、y0、z0统一更新，做积分
    x0,y0,z0=xt,yt,zt
    x.append(x0 + h * (-w * y0 - z0))
    y.append(y0 + h * (w * x0 + a* y0))
    z.append(z0 + h * (b+z0 * (x0 - c)))


def main():
  #设定给的参数,a =0.5 b = 2.0,c =4.0的参数
  w,a,b,c=1,0.5,2,4
  #迭代次数
  T=20000
  #初值
  x0=0
  y0=0
  z0=0
  Rossler(x0, y0, z0, w, a, b, c, T)
  x1 = copy.deepcopy(x)
  y1 = copy.deepcopy(y)
  z1 = copy.deepcopy(z)
  # 初值微小的变化，z0改变0.0001
  x0 = 0
  y0 = 0
  z0 = 0.0001
  Rossler(x0, y0, z0, w, a, b, c, T)

  ax1 = plt.subplot(121,projection="3d")
  ax1.set_xlabel('x(t)')
  ax1.set_ylabel('y(t)')
  ax1.set_zlabel('z(t)')
  ax1.set_title('befor')
  ax2 = plt.subplot(122, projection="3d")
  ax2.set_xlabel('x(t)')
  ax2.set_ylabel('y(t)')
  ax2.set_zlabel('z(t)')
  ax2.set_title('after')
  ax1.scatter(x1,y1,z1,s=1)
  ax2.scatter(x, y, z, s=1)

  # for i in range(T):
  #   ax1.scatter(x1[i],y1[i],z1[i],s=1,c = 'r')
  #   ax2.scatter(x[i], y[i], z[i], s=1,c = 'b')
  #   plt.pause(0.001)
  plt.show()
  plt.savefig("D:/huandun.gif")
  #时间序列图绘制
  t=np.arange(0,T)
  plt.scatter(t,x1,s=1)
  plt.scatter(t,x,s=1)
  plt.show()

if __name__=='__main__':
  main()
